package com.aaa.dang.modules.system.service.impl;

import com.aaa.dang.common.entity.Role;
import com.aaa.dang.common.systemlog.annotation.SysLog;
import com.aaa.dang.common.util.ResultModel;
import com.aaa.dang.modules.system.dao.IRoleDao;
import com.aaa.dang.modules.system.service.IRoleService;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import static com.aaa.dang.common.systemconst.ISystemConst.FAULT_CODE;
import static com.aaa.dang.common.systemconst.ISystemConst.SUCCESS_CODE;

/**
 * 角色业务接口实现
 *
 * @author Dadazhao
 * @date 2018/12/17
 */
@Service
public class RoleServiceImpl implements IRoleService {
    //自动注入DAO层
    @Autowired
    private IRoleDao roleDao;
    @Autowired
    ResultModel model;

    /**
     * 获得所有状态为的角色
     *
     * @param query 查询条件
     * @return 角色列表
     */
    @Override
    public ResultModel getRoleAll(Map<String, Object> query) {
        //判断是否分页
        Boolean isPaging = (query.get("page") != null && query.get("page") != "") && (query.get("limit") != null && query.get("limit") != "");
        if (isPaging) {
            //一页显示多少行
            int pageSize = Integer.parseInt(query.get("limit") + "");
            //当前第几页
            int pageNo = Integer.parseInt(query.get("page") + "");
            //分页插件
            PageHelper.startPage(pageNo, pageSize);
        }
        model.setCode(0);
        model.setMsg("查询成功");
        model.setData(roleDao.getRoleAll(query));
        model.setCount(roleDao.getRoleTotalAll(query));
        return model;
    }

    /**
     * 修改角色状态
     *
     * @param id     角色id
     * @param status 状态 0 正常 1 禁用
     * @return code 0 成功 1 失败
     */
    @Override
    @SysLog(operateType = SysLog.Type.UPDATE, desc = "修改角色状态")
    public ResultModel updateRoleStatus(Integer id, Integer status) {
        int count = roleDao.updateRoleStatus(id, status);
        if (count >= 0) {
            model.setCode(SUCCESS_CODE);
            model.setMsg("变更成功");
            model.setData("");
        } else {
            model.setCode(FAULT_CODE);
            model.setMsg("变更失败");
            model.setData("");
        }
        return model;
    }

    /**
     * 删除角色
     *
     * @param id 角色id
     * @return code 0 成功 1 失败
     */
    @Override
    @Transactional
    @SysLog(operateType = SysLog.Type.DELETE, desc = "删除角色")
    public ResultModel deleteRoleById(Integer id) {
        //删除角色表中的记录
        int rcount = roleDao.deleteRoleById(id);
        //删除员工角色表有关的记录
        int ecount = roleDao.deleteEmpRoleByRoleId(id);
        //删除角色权限表有关的记录
        int pcount = roleDao.deleteRolePermissionByRoleId(id);
        if (rcount > 0) {
            model.setCode(SUCCESS_CODE);
            model.setMsg("删除成功");
            model.setData("");
        } else {
            model.setCode(FAULT_CODE);
            model.setMsg("删除失败");
            model.setData("");
        }
        return model;
    }

    /**
     * 添加角色
     *
     * @param role 角色实体
     * @param ids  权限id 数组
     * @return code 0 成功 1 失败
     */
    @Override
    @Transactional
    @SysLog(operateType = SysLog.Type.ADD, desc = "添加新角色")
    public ResultModel addRole(Role role, Integer[] ids) {
        //添加角色 获得主键
        int rcount = roleDao.addRole(role);
        if (rcount > 0) {
            //给角色添加权限
            int pcount = roleDao.addRolePermission(role.getId(), ids);
            model.setCode(SUCCESS_CODE);
            model.setMsg("添加成功");
            model.setData("");
            return model;
        }
        model.setCode(FAULT_CODE);
        model.setMsg("添加失败");
        model.setData("");
        return model;
    }

    /**
     * 修改角色的权限和信息
     *
     * @param role 角色实体
     * @param ids  权限id 数组
     * @return code 0 成功 1 失败
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    @SysLog(operateType = SysLog.Type.UPDATE, desc = "修改角色的权限和信息")
    public ResultModel updateRoleById(Role role, Integer[] ids) {
        try {
        int count = roleDao.updateRoleById(role);
        //清空角色原有的权限
        int dcount = roleDao.deleteRolePermissionByRoleId(role.getId());
        //添加新的权限
        int acount = roleDao.addRolePermission(role.getId(), ids);

        }catch (Exception e){
            e.printStackTrace();
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
        model.setMsg("修改成功");
        model.setCode(SUCCESS_CODE);
        model.setData("");
        return model;
    }

    /**
     * 校验角色名是否存在
     *
     * @param role 角色实体
     * @return code 0 存在 1不存在
     */
    @Override
    public ResultModel isExistRoleName(Role role) {
        int count = roleDao.isExistRoleName(role);
        if (count > 0) {
            model.setCode(SUCCESS_CODE);
            model.setMsg("已存在");
            model.setData("");
            return model;
        }
        model.setCode(FAULT_CODE);
        model.setMsg("不存在");
        model.setData("");
        return model;
    }

    /**
     * 获得员工拥有的角色
     *
     * @param empLoginame 登录账号
     * @return 角色集合
     */
    @Override
    public Set<String> getRolesByEmpLoginName(String empLoginame) {
        List<Map<String, Object>> roles = roleDao.getRolesByempLoginname(empLoginame);
        //用来存储员工的角色
        HashSet<String> rolesSet = new HashSet<>();
        for (Map<String, Object> role : roles) {
            rolesSet.add(String.valueOf(role.get("roleName")));
        }
        return rolesSet;
    }
}
